/******************************************************************************/
/* Имя файла: calcIdealWeight.cpp                                             */
/* Дата: 05-03-2024                                                           */
/* Разработчик: Андрей Подлегаев                                              */
/* Группа: 315                                                                */
/* Факультет: ЦДО ТУСУР                                                       */
/* Авторское право: Андрею Подлегаеву                                         */
/* Описание: Функции расчета идеал. веса к лабораторной работе №2 (ЦДО ТУСУР) */
/******************************************************************************/


#include "calcIdealWeight.h"


/* Функция вычисления идеального веса для мужчин по формуле Брока
 * @param height рост см
 * @param age возраст, лет
 * Формула Брока:
 *   для мужчин: вес = (рост, см - 100) * 0.9
 */
float calcIdealWeightMan(const float height, const int age)
{
  float weight;
  weight = (height - 100) * 0.9;

  if (age >= 20 && age <= 30) {
      return weight - weight * 0.11;
    }
  else if (age >= 50) {
      return weight + weight * 0.06;
    }
  else
    return weight;
}

/* Функция вычисления идеального веса для женщин по формуле Брока
 * @param height рост см
 * @param age возраст, лет
 * Формула Брока:
 *   для женщин: вес = (рост, см - 100) * 0.85
 */
float calcIdealWeightWoman(const float height, const int age)
{
  float weight;
  weight = (height - 100) * 0.85;

  if (age >= 20 && age <= 30) {
      return weight - weight * 0.11;
    }
  else if (age >= 50) {
      return weight + weight * 0.06;
    }
  else
    return weight;
}


/* Функция расчета индекса массы тела по формуле Кетле
 * @param weight вес (масса), кг
 * @param height рост, м
 */
float calcBodyMassIndex(const float weight, const float height)
{
  return weight / pow(height/100, 2.0);
}

/* Функция интерпретации индекса массы тела по формуле Кетле
 * @param massIndex индекс массы тела
 */
std::string interpBodyMassIndex(const float massIndex)
{
  if (massIndex < 16) {
      return "Выраженному дефициту массы";
    }
  else if (massIndex > 16 && massIndex < 18.5) {
      return "Недостаточному (дефициту) массы тела";
    }
  else if (massIndex > 18.5 && massIndex < 25) {
      return "Норме";
    }
  else if (massIndex > 25 && massIndex < 30) {
      return "Избыточной массе тела (предожирение)";
    }
  else if (massIndex > 30 && massIndex < 35) {
      return "Ожирению первой степени";
    }
  else if (massIndex > 35 && massIndex < 40) {
      return "Ожирению второй степени";
    }
  else
    return "Ожирению третьей степени (морбидному)";
}

// TODO в следующих функциях мне не нравится повторении одних и тех же сообщений

/* Функция интерпретации индекса массы тела по формуле Кетле
 * с учетом возраста для мужчин
 * @param age возраст
 * @param massIndex индекс массы тела
 */
std::string interpBodyMassIndexAgeMan(const int age, const float massIndex)
{
  float differenceIndex;

  if (age >= 19 && age <= 24) {
      differenceIndex = massIndex - 21.4;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 21.4) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 25 && age <= 34) {
      differenceIndex = massIndex - 21.6;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 21.6) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 35 && age <= 44) {
      differenceIndex =  massIndex - 22.9;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 22.9) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 45 && age <= 54) {
      differenceIndex =  massIndex - 25.8;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 25.8) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 55) {
      differenceIndex =  massIndex - 26.6;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 26.6) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else
    return "Ваш возраст меньше 19 лет, интерпретация невозможна!";
}


/* Функция интерпретации индекса массы тела по формуле Кетле
 * с учетом возраста для женщиин
 * @param age возраст
 * @param massIndex индекс массы тела
 */
std::string interpBodyMassIndexAgeWoman(const int age, const float massIndex)
{
  float differenceIndex;

  if (age >= 19 && age <= 24) {
      differenceIndex = massIndex - 19.5;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 19.5) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 25 && age <= 34) {
      differenceIndex = massIndex - 23.2;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 23.2) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 35 && age <= 44) {
      differenceIndex =  massIndex - 23.4;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 23.4) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 45 && age <= 54) {
      differenceIndex =  massIndex - 25.2;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 25.2) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else if (age >= 55) {
      differenceIndex =  massIndex - 27.3;
      if (differenceIndex > 5.0) {
          return "Ваш индекс массы превышает нормальный показатель больше чем "
                 "на 5 единиц.\nУ вас имеются проблемы с лишним весом.";
        }
      else if (massIndex < 27.3) {
          return "у Вас выраженный дефицит массы.";
        }
      else {
          return "Ваш вес в норме.";
        }
    }
  else
    return "Ваш возраст меньше 19 лет, интерпретация невозможна!";

  // TODO необходимо продумать и доделать функцию
}

/* Функции вывода отчета о состоянии массы тела
 * @param age возраст, лет
 * @param weight вес (масса), кг
 * @param height рост, см
 * @param gender пол, bool 1 или 0
 */
void bodyWeightStatusReport(const int age, const float weight,
                            const float height, const bool gender)
{
  std::cout << "*****" << "\t\t\t" << "Отчет с результатами анализа массы тела" << "\t\t\t" << "*****\n";

  std::cout << "Ваш возраст:\t " << age << " лет/года\n";
  std::cout << "Ваш вес:\t " << weight << " кг\n";
  std::cout << "Ваш рост:\t " << height << " см\n";

  float massIndex;
  if (gender) {

      std::cout << "Ваш пол:\t " << "Муж\n";

      massIndex = calcBodyMassIndex(weight, height);
      std::cout << "\nВаш индекс массы, без учета возраста и пола равен: "
                << std::round(massIndex);

      std::cout <<  "\nСогасно приблизительному расчёту Ваш ИМТ соответствует: ";
      std::cout << interpBodyMassIndex(massIndex);

      std::cout <<  "\nСогасно точному расчёту с учетом возраста "
                 << interpBodyMassIndexAgeMan(age, massIndex);

      std::cout << "\n\nРекомендуем Вам поддерживать массу тела на уровне: "
                << calcIdealWeightMan(height, age) << " кг";
    }
  else {
      std::cout << "Ваш пол:\t " << "Жен\n";

      massIndex = calcBodyMassIndex(weight, height);
      std::cout << "\nВаш индекс массы, без учета возраста и пола равен: "
                << std::round(massIndex);

      std::cout <<  "\nСогасно приблизительному расчёту Ваш ИМТ соответствует: ";
      std::cout << interpBodyMassIndex(massIndex);
      std::cout <<  "\nСогасно точному расчёту с учетом возраста "
                 << interpBodyMassIndexAgeWoman(age, massIndex);

      std::cout << "\n\nЗабудьте про расчет и поддерживайте массу тела на уровне: "
                << calcIdealWeightWoman(height, age) << " кг";

    }
}
